#ifndef MINIPARACURVE_H
#define MINIPARACURVE_H

#include "MiniObject.h"
#include "MiniBSplineSurface.h"

namespace XYF
{
    /**
     * @file: MiniParaCurve.h
     * @author: xingyifan
     * @date: 2023-04-22 22:56
     *
     * @description: 参数曲线类
     */

    class MiniParaCurve : public MiniObject
    {
    public:
        MiniParaCurve(Func13 f, Real left, Real right);

        // 重载返回类型
        virtual int GetType() override;

        Real GetBegin() const; // 获得起始位置参数
        Real GetEnd() const;   // 获得结束位置参数

        Vector3f CurvePoint(Real u) const;          // 计算参数 u 处的点
        Vector3f CurveDerivPoint(Real u) const;     // 计算参数 u 处的导向量
        Vector3f CurveDeriv2Point(Real u) const;    // 计算参数 u 处的二阶导向量

        // 计算投影离散曲线：输入投影曲线，还需要初始参数和终止参数，以及行进次数，最后是初始投影的容许误差；返回参数
        MiniArray<Vector> CurveOthroProjection(MiniBSplineSurface *surface, Real t0, Real t1, int N, Real tol) const;
        MiniArray<Vector> CurveMarchProjection(MiniBSplineSurface *surface, Real t0, Real t1, int N, Real tol) const;

    protected:
        Func13 m_f;   // 参数形式
        Real m_left;  // 左边界
        Real m_right; // 右边界
    };

}

#endif // MINIPARACURVE_H
